import re

# 最常规的匹配
def match_nomal():
    content = 'Hello 123 4567 World_This is a perfect Regex Demo'
    result = re.match('^Hello\s\d\d\d\s\d{4}\s\w{10}.*Demo$',content)
    print(result)
    print(result.group())
    print(result.span())  #  匹配结果的范围

# 泛匹配
def match_fan():
    content = 'Hello 123 4567 World_This is a perfect Regex Demo'
    result = re.match('^Hello.*Demo$', content)  # .* 把中间的所有字符都匹配到
    print(result.group())
    print(result.span())

# match_fan()


# 匹配目标  : 想从字符串中获取想要的数据  可以用() 然后指定左右端点
def get_str():
    content = 'Hello 1234567 World_This is a perfect Regex Demo'
    # 取出数字
    result = re.match('^Hello\s(\d+)\sWorld.*Demo$', content)
    print(result)
    print(result.group(1))  # 把第一个括号括起来的内容输出出来了

# get_str()

# 贪婪匹配
def tanlan_match():
    content = 'Hello 1234567 World_This is a perfect Regex Demo'
    result = re.match('^He.*(\d+).*Demo$', content)
    print(result)
    print(result.group(1))  #  打印结果只有  7 -- 123456 被 .*匹配掉了 会匹配尽可能多的字符

# tanlan_match()

# 非贪婪匹配
def unTanlan_match():
    content = 'Hello 1234567 World_This is a perfect Regex Demo'
    result = re.match('^He.*?(\d+).*Demo$', content)  #  ? 会匹配尽可能少的字符
    print(result.group(1))  # 匹配结果是  1234567

# unTanlan_match()


# 匹配模式
def pattern_match():
    content = '''Hello 1234567 World_This 
    is a perfect Regex Demo'''
    result = re.match('He.*?(\d+).*?Demo$',content, re.S)   #  换行符
    print(result.group(1))

# pattern_match()



# 转义
def zhuanyi():
    content = 'price is $5.00'
    # result = re.match('price is $5.00', content)  #  $ . 都是特殊字符  直接写不生效
    result = re.match('price is \$5\.00', content)  # \ 进行转义
    print(result)

# zhuanyi()

"""
总结:
    尽量使用泛匹配,使用括号得到匹配目标,尽量使用非贪婪模式,有换行符就使用re.S
"""


#### re.search()
"""
    直接搜索整个字符串,如果有符合你指定的表达式的内容的话,那么就会直接返回
    会扫描整个字符串,返回第一个成功的匹配
"""
def search_1():
    content = 'Extra string Hello 1234567 World_This is a Regex Demo Extra string'
    # result = re.match('Hello.*?(\d+).*?Demo', content) None
    result = re.search('Hello.*?(\d+).*?Demo', content) # None
    print(result.group())

# search_1()

"""
总结: 为了方便,能用search 就不用match
"""



######匹配演练
def yanlian_1():
    html = '''<div id="songs-list">
        <h2 class="title">经典老歌</h2>
        <p class="introduction">
            经典老歌列表
        </p>
        <ul id="list" class="list-group">
            <li data-view="2">一路上有你</li>
            <li data-view="7">
                <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
            </l    <h2 class="title">经典老歌</h2>
        <p class="introduction">
            经典老歌列表
        </p>
        <ul id="list" class="list-group">
            <li data-view="2">一路上有你</li>
            <li data-view="7">
                <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
            </li>
            <li data-view="4" class="active">
                <a href="/3.mp3" singer="齐秦">往事随风</a>
            </li>
            <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
            <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
            <li data-view="5">
                <a href="/6.mp3" singer="邓丽君"><i class="fa fa-user"></i>但愿人长久</a>
            </li>
        </ul>
    </div>'''
    result = re.search('<li.*?active.*?singer="(.*?)">(.*?)</a>', html, re.S)
    if result:
        print(result.group(1), result.group(2))  # 齐秦 往事随风


# yanlian_1()


def yanlian_2():
    html = '''<div id="songs-list">
        <h2 class="title">经典老歌</h2>
        <p class="introduction">
            经典老歌列表
        </p>
        <ul id="list" class="list-group">
            <li data-view="2">一路上有你</li>
            <li data-view="7">
                <a href="/2.mp3" singer="任贤齐">沧海1一声笑</a>
            </l    <h2 class="title">经典老歌</h2>
        <p class="introduction">
            经典老歌列表
        </p>
        <ul id="list" class="list-group">
            <li data-view="2">一路上有你</li>
            <li data-view="7">
                <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
            </li>
            <li data-view="4" class="active">
                <a href="/3.mp3" singer="齐秦">往事随风</a>
            </li>
            <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
            <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
            <li data-view="5">
                <a href="/6.mp3" singer="邓丽君"><i class="fa fa-user"></i>但愿人长久</a>
            </li>
        </ul>
    </div>'''
    result = re.search('<li.*?singer="(.*?)">(.*?)</a>', html, re.S)
    if result:
        print(result.group(1), result.group(2))  # 齐秦 往事随风



# yanlian_2()
# def shizhan3():


#### findAll()  方法
def find_all_1():
    html = '''<div id="songs-list">
        <h2 class="title">经典老歌</h2>
        <p class="introduction">
            经典老歌列表
        </p>
        <ul id="list" class="list-group">
            <li data-view="2">一路上有你</li>
            <li data-view="7">
                <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
            </li>
            <li data-view="4" class="active">
                <a href="/3.mp3" singer="齐秦">往事随风</a>
            </li>
            <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
            <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
            <li data-view="5">
                <a href="/6.mp3" singer="邓丽君">但愿人长久</a>
            </li>
        </ul>
    </div>'''
    # findall() 方法查询符合条件的所有
    # 返回的结果是 list
    results = re.findall('<li.*?href="(.*?)".*?singer="(.*?)">(.*?)</a>', html, re.S)
    print(results)  # 没有超链接的匹配不了
    for result in results:
        print(result)
        print(result[0], result[1], result[2])

# find_all_1()

# 匹配所有的歌名  --  有点没有超连接
def find_all_2():
    html = '''<div id="songs-list">
        <h2 class="title">经典老歌</h2>
        <p class="introduction">
            经典老歌列表
        </p>
        <ul id="list" class="list-group">
            <li data-view="2">一路上有你</li>
            <li data-view="7">
                <a href="/2.mp3" singer="任贤齐">沧海一声笑</a>
            </li>
            <li data-view="4" class="active">
                <a href="/3.mp3" singer="齐秦">往事随风</a>
            </li>
            <li data-view="6"><a href="/4.mp3" singer="beyond">光辉岁月</a></li>
            <li data-view="5"><a href="/5.mp3" singer="陈慧琳">记事本</a></li>
            <li data-view="5">
                <a href="/6.mp3" singer="邓丽君">但愿人长久</a>
            </li>
        </ul>
    </div>'''
    # findall() 方法查询符合条件的所有
    # 最后两个没有换行  第二个第三个  是有换行的
    #  \s 代表空白字符   --  可能有可能没有,  * 代表可能有多个换行符或者多个空白符  ? 代表的是有还是没有
    #  所以 \s*?代表的是换行符或者空白符  有还是没有   -- 这样就可以匹配有还是没有换行符
    #  (<a.*?>)? 代表的是a标签有还是没有
    results = re.findall('<li.*?>\s*?(<a.*?>)?(\w+)(</a>)?\s*?</li>', html, re.S)
    print(results)  # 没有超链接的匹配不了
    for result in results:
        print(result)
        # print(result[0], result[1], result[2])



# find_all_2()

